gtkplacessidebar: Disconnect and unref cloud_manager in dispose
authorJan Alexander Steffens (heftig) <jan.steffens@gmail.com>
Wed, 7 Oct 2020 02:34:11 +0000 (22:34 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 7 Oct 2020 19:16:31 +0000 (15:16 -0400)
The manager's providers-changed signal can fire after the sidebar has
been freed. Make sure we disconnect the sidebar from the manager.

https://bugs.archlinux.org/task/57984
https://bugs.archlinux.org/task/68123

gtk/gtkplacessidebar.c

index a6124cc80003933317029cc9cbbeda5089e66846..4a936bf5b448f78766fee4fdd7c9d7a70ce09324 100644 (file)
@@ -4011,17 +4011,23 @@ gtk_places_sidebar_dispose (GObject *object)
   g_clear_object (&sidebar->shortcuts);
 
 #ifdef HAVE_CLOUDPROVIDERS
-  for (l = cloud_providers_collector_get_providers (sidebar->cloud_manager);
-       l != NULL; l = l->next)
-    {
-      g_signal_handlers_disconnect_by_data (l->data, sidebar);
-    }
   for (l = sidebar->unready_accounts; l != NULL; l = l->next)
     {
         g_signal_handlers_disconnect_by_data (l->data, sidebar);
     }
   g_list_free_full (sidebar->unready_accounts, g_object_unref);
   sidebar->unready_accounts = NULL;
+  if (sidebar->cloud_manager)
+    {
+      g_signal_handlers_disconnect_by_data (sidebar->cloud_manager, sidebar);
+      for (l = cloud_providers_collector_get_providers (sidebar->cloud_manager);
+           l != NULL; l = l->next)
+        {
+          g_signal_handlers_disconnect_by_data (l->data, sidebar);
+        }
+      g_object_unref (sidebar->cloud_manager);
+      sidebar->cloud_manager = NULL;
+    }
 #endif
 
   G_OBJECT_CLASS (gtk_places_sidebar_parent_class)->dispose (object);
@@ -4034,10 +4040,6 @@ gtk_places_sidebar_finalize (GObject *object)
 
   g_clear_object (&sidebar->row_actions);
 
-#ifdef HAVE_CLOUDPROVIDERS
-  g_clear_object (&sidebar->cloud_manager);
-#endif
-
   g_clear_pointer (&sidebar->swin, gtk_widget_unparent);
 
   G_OBJECT_CLASS (gtk_places_sidebar_parent_class)->finalize (object);